package com.qingsong.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.qingsong.dto.*;
import com.qingsong.entity.User;
import com.qingsong.entity.User;
import com.qingsong.excel.UserExcelDTO;
import com.qingsong.vo.LoginVO;
import com.qingsong.vo.UserSimpleListVO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 用户表 服务层。
 *
 * @author qingsong
 * @since 2024-12-22
 */
public interface UserService extends IService<User> {
    boolean insert(UserInsertDTO dto);

    User select(Long id);

    boolean update(UserUpdateDTO dto);

    boolean delete(Long id);

    boolean deleteBatch(List<Long> ids);

    List<UserSimpleListVO> simpleList();

    Page<User> page(UserPageDTO dto);

    /**
     * 按主键查询该用户的全部角色ID列表
     * @param id 角色主键
     * @return 该用户的全部角色ID列表
     */
    List<Long> listRoleIds(Long id);

    /**
     * 按主键修改该用户的角色列表
     * @param dto 用户修改DTO
     */
    boolean updateRoles(UserUpdateDTO dto);

    boolean resetPassword(Long id);

    /**
     * 修改用户密码
     *
     * @param dto 修改密码DTO
     * @return true修改成功，false修改失败
     */
    boolean updatePassword(UserUpdatePasswordDTO dto);

    /**
     * 统计用户数据
     *
     * @return 统计结果
     */
    Map<String, Object> statistics();

    /**
     * 用户Excel记录
     *
     * @return 全查用户记录，Excel类型的数据
     */
    List<UserExcelDTO> excel();

    /**
     * 根据用户主键上传头像
     * @param avatarFile 头像文件
     * @param id 用户主键
     * @return 返回新文件名
     */
    String uploadAvatar(MultipartFile avatarFile, Long id);

    /**
     * 根据手机号码生成一个随机的4位短信验证码
     * @param phone 手机号码
     * @return 一个随机的4位短信验证码
     */
    String getVcode(String phone);

    /**
     * 根据手机号码+验证码登录
     * @param dto 用户登录DTO
     * @return 返回登陆成功的用户记录，Token令牌以及菜单列表
     */
    LoginVO loginByPhone(LoginByPhoneDTO dto);

    LoginVO loginByAccount(@Validated @RequestBody LoginByAccountDTO dto);
}
